Go语言面向对象

364次阅读
没有评论

共计 2808 个字符,预计需要花费 8 分钟才能阅读完成。

Go 不是纯粹的面向对象语言,和传统的面向对象编程有区别,所以说 Go 语言支持面向对象编程特性是比较准确的。

Go 语言基于结构体 struct 来实现 OOP 特性,通过 type 和 struct 关键字声明结构体,格式如下:

type 类型名 struct { // 类型名在同一个包内不能重复
  字段 1 字段 1 类型 // 字段名必须唯一
  字段 2 字段 2 类型
}

结构体从本质上讲是一种自定义的数据类型,只不过这种数据类型比较复杂,可以认为结构体是一种聚合类型。

结构体实例化

声明结构体变量再赋值:

type Student struct {
  sid    int      // 字段首字母小写,类似 private,其它包不能使用
  course []string // 选修课程}

func main() {
  // 声明一个结构体对象,值类型,默认开辟空间,字段赋予零值
  var s Student
  fmt.Println("s:", s) // s: {0 []}
  // 访问结构体成员使用点号 . 操作符
  fmt.Println(s.sid) // 0
  // 更改成员变量值
  s.sid = 1001
  fmt.Println(s.sid) // 1001

  // 方式 2:键值对赋值
  s2 := Student{sid: 1002, course: []string{"chinese", "math"}}
  fmt.Println(s2)
  // 方式 3:多值赋值
  s3 := Student{1003, []string{"chinese", "math"}}
  fmt.Println(s3)
}

实例化之 & 结构体:

func initSid(s *Student) {s.sid = 1001 // 其实是 (*s).sid = 1001
}

func main() {s := Student{course: []string{"chinese", "math"}}
  initSid(&s)
  fmt.Println(s) // {1001 [chinese math]}

  s2 := &Student{course: []string{"chinese", "math"}}
  initSid(s2)
  fmt.Println(s2) // &{1001 [chinese math]}
}

实例化之 new(结构体):

func main() {s := new(Student) // 等同于 &Student{}
  fmt.Println(s)    // &{0 []}
}

模拟构造函数

Go 语言没有构造函数,但可以使用结构体初始化过程来模拟实现构造函数(首字母大写)。

// 自定义工厂函数,返回局部变量地址
func NewStudent(sid int, course []string) *Student {
  return &Student{
    sid:    sid,
    course: course}
}

func main() {s := NewStudent(1001, []string{"math", "english"})
  fmt.Println(s) // &{1001 [math english]}
}

方法接收器

Go 语言中的方法(Method)是一种作用于特定类型变量的函数,这种特定类型变量叫做接收者(Receiver)。方法与函数的区别是,函数不属于任何类型,方法属于特定类型。

func (s Student) learn() {fmt.Printf("%d 正在学习...", s.sid)
}

func main() {s := NewStudent(1001, []string{"math", "english"})
  s.learn()}

接收者是指针类型:

type Player struct {
  Name        string
  HealthPoint int
}

func NewPlayer(name string, hp int) *Player {
  return &Player{
    name,
    hp,
  }
}

func (p *Player) attack() {fmt.Printf("%s 发起攻击!\n", p.Name)
}

func (p *Player) attacked() {fmt.Printf("%s 被攻击!\n", p.Name)
  p.HealthPoint -= 10
  fmt.Println("HealthPoint:", p.HealthPoint)
}

func main() {player := NewPlayer(" 张三 ", 100)
  player.attack()
  player.attacked()}

匿名字段

结构体允许其成员字段在声明时没有字段名而只有类型,这种没有名字的字段称为匿名字段。

type Person struct {
  string // 其实是 string string
  int    // 其实是 int int
}

func main() {
  p := Person{
    " 张三 ",
    18,
  }
  fmt.Println(p.string, p.int) // 张三 18
}

结构体也可以作为匿名字段使用:

type Addr struct {
  province string
  city     string
}

type Person struct {
  string
  int
  Addr // 其实是 Addr Addr
}

func main() {
  p := Person{
    " 张三 ",
    18,
    Addr{" 广东 ", " 深圳 "},
  }
  fmt.Println(p.Addr.province, p.city) // 广东 深圳
}

当结构体中有和匿名字段相同字段时,采用外层优先访问原则。

包和封装

每个目录一个包,main 包包含可执行入口。

为结构定义的方法必须放在同一个包内,可以是不同文件。

结构体继承

// Animal 动物
type Animal struct {name string}

func (a *Animal) eat() {fmt.Printf("%s is eating!\n", a.name)
}

// Dog 类型
type Dog struct {
  Kind    string
  *Animal // 通过嵌套匿名结构体实现继承,直接写类型,没有字段名
}

func (d *Dog) bark() {fmt.Printf("%s is barking ~\n", d.name)
}

func main() {
  d := &Dog{
    Kind: " 金毛 ",
    Animal: &Animal{ // 注意嵌套的是结构体指针
      name: " 旺财 ",
    },
  }
  d.eat()
  d.bark()}

结构体标签

type Stu struct {
  Name string `json:"name"` // 结构体标签
  Age  int    `json:"-"`    // 表示不参与序列化
}

func main() {stuStruct := Stu{Name: " 张三 ", Age: 18}

  // 序列化
  jsonStuStruct, _ := json.Marshal(stuStruct)
  fmt.Println(string(jsonStuStruct)) // {"name":" 张三 "}

  // 反序列化
  var StuStruct Stu
  err := json.Unmarshal(jsonStuStruct, &StuStruct)
  if err != nil {return}
  fmt.Println(StuStruct) // {张三 0}
}

正文完
 0
阿伯手记
版权声明:本站原创文章,由 阿伯手记 于2024-02-22发表,共计2808字。
转载说明:本站原创内容,除特殊说明外,均基于 CC BY-NC-SA 4.0 协议发布,转载须注明出处与链接。
评论(没有评论)
验证码

阿伯手记

阿伯手记
阿伯手记
喜欢编程,头发渐稀;成长路上,宝藏满地
文章数
767
评论数
207
阅读量
682808
今日一言
-「
热门文章
职场救急!AI请假话术生成器:1秒定制高通过率理由

职场救急!AI请假话术生成器:1秒定制高通过率理由

超级借口 不好开口?借口交给我!智能生成工作请假、上学请假、饭局爽约、约会拒绝、邀约推辞、万能借口等各种借口理...
夸克网盘快传助手提高非VIP下载速度

夸克网盘快传助手提高非VIP下载速度

夸克网盘限速这个大家都知道,不开会员差不多限速在几百 K。那有没有办法在合法合规途径加速下载夸克网盘呢?这里推...
TVAPP:开源电视盒子资源库,一键打造家庭影院

TVAPP:开源电视盒子资源库,一键打造家庭影院

导语 TVAPP 是一个专为 Android TV 电视盒子用户打造的开源影音资源库,集成了影视、直播、游戏等...
巴别英语:用美剧和TED演讲轻松提升英语听力与口语

巴别英语:用美剧和TED演讲轻松提升英语听力与口语

还在为枯燥的英语学习而烦恼吗?巴别英语通过创新的美剧学习模式,让英语学习变得生动有趣。平台提供海量美剧和 TE...
Chinese Name Generator 在线中文姓名生成器

Chinese Name Generator 在线中文姓名生成器

Chinese Name Generator 是一款在线中文姓名生成器,可在几秒内生成符合个人需求的中文名字。...
2025年12月 每日精选

2025年12月 每日精选

关于每日精选栏目 发现一些不错的资源,点击 这里 快速投稿。 12 月 26 日 .ax 顶级域 目前全球唯一...
123云盘限时福利:登录即送1个月VIP尊享权益!

123云盘限时福利:登录即送1个月VIP尊享权益!

🎁  零成本体验 20T 超大空间与会员加速通道 🎉 活动亮点 登录即送:无需任何复杂操作,登录账号直接领取 ...
最新评论
阿伯手记 阿伯手记 发了:https://aboss.top/moments/1064
吴蛋蛋 吴蛋蛋 快发小年快乐
吴蛋蛋 吴蛋蛋 Ask4Me,这个之前看server酱接入了
15220202929 15220202929 怎么用
八对 八对 麻烦大佬更新下【堆新】的友链站名:八对星星描述:极目星视穹苍无界•足履行者大地有疆链接:https://8dui.com图标:https://cf.8dui.com/logo.webp横标:https://cf.8dui.com/logo-w.webp订阅:https://8dui.com/rss.xml
三毛笔记 三毛笔记 已添加
DUINEW DUINEW 已添加贵站,期待贵站友链~博客名称:堆新博客地址:https://duinew.com/博客描述:堆新堆新,引力向新!——堆新(DUINEW)博客头像:https://d.duinew.com/logo.webp横版头像:https://d.duinew.com/logo-w.webp博客订阅:https://duinew.com/rss.xml
hedp hedp 没看懂
bingo bingo 直接生成就可以啦,也可以添加一些选项
热评文章
夸克网盘快传助手提高非VIP下载速度

夸克网盘快传助手提高非VIP下载速度

夸克网盘限速这个大家都知道,不开会员差不多限速在几百 K。那有没有办法在合法合规途径加速下载夸克网盘呢?这里推...
Short-Link 免费开源短网址程序,基于Fastify、Vercel和Supabase构建

Short-Link 免费开源短网址程序,基于Fastify、Vercel和Supabase构建

Short-Link 是一款基于 Fastify、Vercel 和 Supabase 构建的 URL 缩短服务...
清华大学官方免费DeepSeek教程

清华大学官方免费DeepSeek教程

AI 领域近期最引人注目的焦点当属 DeepSeek,这款由中国创新企业深度求索研发的人工智能工具,正以开放源...
Chinese Name Generator 在线中文姓名生成器

Chinese Name Generator 在线中文姓名生成器

Chinese Name Generator 是一款在线中文姓名生成器,可在几秒内生成符合个人需求的中文名字。...
2026年2月 每日精选

2026年2月 每日精选

关于每日精选栏目 发现一些不错的资源,点击 这里 快速投稿。 2 月 17 日 国家全民健身信息服务平台 过年...
DrawLink:一键生成链接视觉卡片,提升分享点击率

DrawLink:一键生成链接视觉卡片,提升分享点击率

小贴士 :此站或已变迁,但探索不止步。我们已为您备好「类似网站」精选合集,相信其中的发现同样能为您带来惊喜。
WebRTC Screen Mirror:基于浏览器免费开源投屏神器,可实现低延迟、跨平台屏幕共享

WebRTC Screen Mirror:基于浏览器免费开源投屏神器,可实现低延迟、跨平台屏幕共享

WebRTC Screen Mirror 是一款基于 WebRTC 技术的在线屏幕共享工具,它利用浏览器内置的...